package cn.wolfcode.luowowo.interceptor;

import cn.wolfcode.luowowo.annotation.RequireLogin;
import cn.wolfcode.luowowo.cache.service.impl.UserInfoRedisServiceImpl;
import cn.wolfcode.luowowo.domain.UserInfo;
import cn.wolfcode.luowowo.util.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 登陆拦截器
 * 先解决跨域访问或静态请求被拦截
 * 用贴自定义注解决定哪些是需要拦截的哪些是不需要拦截的方法
 * 贴了标签的则判断有没有登陆对象.在redis中通过获取请求头的方式作为key去查找
 * 如果贴了标签又没有对象则不放行(用流的方式返回回去要登陆的提示)
 * 最后在启动器配置拦截的路径和不拦截的路径
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private UserInfoRedisServiceImpl userInfoRedisService;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


        // 解决跨域拦截或静态请求拦截
        if( !(handler instanceof HandlerMethod)){
            return true;
        }

        // 获取请求头
        String token = request.getHeader("token");
        // 拿到当前请求对象(即使访问的是没贴标签的方法.也需要重新设置存活时间)
        UserInfo userInfo = userInfoRedisService.getToken(token);
        // 强转一下
          HandlerMethod hd = (HandlerMethod) handler;

          // 判断有没有贴自定义标签
          if (hd.hasMethodAnnotation(RequireLogin.class)){
              // 如果贴了标签又没有对象不放行
              if(userInfo == null){
                  response.setContentType("application/json;charset=utf-8");
                  // 返回回去提示要登陆
                  response.getWriter().write(JSON.toJSONString(JsonResult.noLogin()));
                  // 不放行
                  return false;
              }
          }

          // 最后记得放行
          return true;
    }
}
